Packages
Case studies
Load data
per lemma
Comparative analyses
Filtering
- specific lemmas
- data after 2018-12-31
- frequency threshhold
- edges threshhold
Usage intensity
uses <- get_uses(tweets)
uses_tot <- get_uses_tot(uses)
age = get_age(uses)
coef_var <- get_coef_var(uses)
mean_date <- get_mean_date(uses)
max_date <- get_max_date(uses)
uses_month <- conv_uses_month(uses)
uses_plt <- plt_uses(uses_month, lemma, mean_date, max_date)
ggplotly(uses_plt)
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
Degree centralization
Diachronic
plt <- df_comp %>%
filter(
SUBSET != 'full',
# LEMMA == 'solopreneur'
LEMMA %in% c(
'political correctness'
)
) %>%
select(LEMMA, SUBSET, CENT_DEGREE) %>%
mutate(SUBSET = factor(SUBSET, levels=c('first', 'mean', 'max', 'last'))) %>%
ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
guides(group=FALSE) +
ggtitle('Diffusion over time: changes in degree centralization') +
scale_y_continuous('degree centrality (log)', trans='log') +
scale_x_discrete('subset')
plt

# ggsave('out/cent_deg_diac_Anglo-Saxon.pdf', width=6, height=4)
Comparative analyses
Degree centrality
Overall
Plot
plt <- df_comp %>%
select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
filter(SUBSET == 'full') %>%
arrange((CENT_DEGREE)) %>%
ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
geom_point() +
scale_y_discrete('lemmas') +
scale_x_continuous(
'degree centralization (log)',
trans='log'
)
plt
ggsave('out/cent_sync_all.pdf', width=6, height=4)

Over time
Across all lemmas
df_comp %>%
filter(
SUBSET %in% (c(
'first',
'last'
# 'mean',
# 'max'
)),
EDGES >= 700
) %>%
group_by(SUBSET) %>%
summarize(CENT_AVG = mean(CENT_DEGREE)) %>%
mutate(SUBSET = factor(SUBSET, levels=c(
'first',
'last'
# 'mean',
# 'max'
))) %>%
ggplot(., aes(x=SUBSET, y=CENT_AVG, group=1)) +
geom_col()

Biggest changes
df_comp %>%
select(LEMMA, SUBSET, CENT_DEGREE, EDGES) %>%
filter(
SUBSET %in% c('first', 'last'),
EDGES >= 100
) %>%
dplyr::group_by(LEMMA) %>%
dplyr::mutate(CENT_DIFF = lag(CENT_DEGREE) - CENT_DEGREE) %>%
drop_na() %>%
select(-SUBSET) %>%
rename(
CENT_LAST = CENT_DEGREE,
EDGES_LAST = EDGES
) %>%
arrange(desc(CENT_DIFF))
Usage intensity vs. network characteristics
Uses vs. degree centralization
Plot
df_comp %>%
filter(
SUBSET == 'full',
# USES %in% (10000:2000000),
USES %in% (150000:500000),
!LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
) %>%
select(LEMMA, CENT_DEGREE, USES, EDGES) %>%
ggplot(., aes(x=CENT_DEGREE, y=USES)) +
geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) +
geom_point() +
scale_y_continuous(
'usage frequency (log)',
trans='log'
) +
scale_x_continuous(
'degree centralization',
# trans='log'
) +
ggtitle(
# 'Usage frequency vs. degree centralization: full sample'
'Usage frequency vs. degree centralization: zooming on case study lexemes'
)
# geom_smooth(method=lm)
ggsave('~/Desktop/freq-vs-net.pdf', width=6, height=4)

NA
Correlation
df_corr_full <- df_comp %>%
filter(
SUBSET != 'full',
EDGES >= 100
) %>%
select(-c(LEMMA, SUBSET, NET_WINDOW_DATES, SKIP, STAMP, NROWS))
cor.test(df_corr_full$USES, df_corr_full$CENT_DEGREE)
Degree centrality vs. communities
Correlation
df_comp %>%
filter(SUBSET == 'last') %>%
select(CENT_DEGREE, COMMUNITIES) %>%
mutate(COMMUNITIES = as.numeric(COMMUNITIES)) %>%
correlate()
Plot
df_comp %>%
filter(SUBSET == 'last') %>%
select(LEMMA, CENT_DEGREE, COMMUNITIES) %>%
ggplot(., aes(x=CENT_DEGREE, y=as.numeric(COMMUNITIES))) +
geom_text(aes(label=LEMMA)) +
scale_x_continuous(trans='log')
Uses vs. users
Plot
plt <- df_comp %>%
filter(SUBSET == 'full') %>%
select(LEMMA, USES, USERS) %>%
ggplot(., aes(x=USERS, y=USES)) +
geom_text(aes(label=LEMMA)) +
scale_x_continuous(trans='log') +
scale_y_continuous(trans='log') +
geom_smooth(method=lm)
ggplotly(plt)
Correlation
df_comp %>%
filter(SUBSET == 'full') %>%
select(USES, USERS) %>%
correlate()
Coefficient of variation
df_comp %>%
filter(
SUBSET == 'full',
USES >= 1000
) %>%
select(LEMMA, USES, COEF_VAR) %>%
arrange(desc(COEF_VAR))
COEF_VAR vs. CENT
df_comp %>%
filter(SUBSET == 'full') %>%
select(LEMMA, COEF_VAR, CENT_DEGREE) %>%
ggplot(., aes(y=COEF_VAR, x=CENT_DEGREE)) +
geom_text(aes(label=LEMMA)) +
scale_y_continuous(trans='log')
Correlations: EDA
library(Hmisc)
df_corr <- df_comp %>%
# filter(SUBSET == 'last') %>%
select(-c(LEMMA, SUBSET, NET_WINDOW_DATES, SKIP, STAMP, NROWS))
# select(-c(USERS, AGE)) %>%
# mutate(FOCUS = USES) %>%
# focus(FOCUS) %>%
# ggplot(., aes(reorder(rowname, FOCUS), FOCUS)) +
# geom_col() +
# coord_flip()
# rearrange() %>%
# shave() %>%
# rplot()
# network_plot(min_cor=.5) %>%
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBQYWNrYWdlcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kc291cmNlKCdzcmMvbG9hZC1kYXRhLlInKQpzb3VyY2UoJ3NyYy9wb3N0cHJvYy5SJykKc291cmNlKCdzcmMvdXNlcy5SJykKc291cmNlKCdzcmMvdXNlcnMuUicpCnNvdXJjZSgnc3JjL3NuYS5SJykKCmxpYnJhcnkoY29ycnIpCmxpYnJhcnkodGlkeXIpCmBgYAoKIyBDYXNlIHN0dWRpZXMKCiMjIExvYWQgZGF0YQoKIyMjIHBlciBsZW1tYQoKYGBge3IgaW5jbHVkZT1GQUxTRX0KY29ycHVzIDwtICcvVm9sdW1lcy9xamQvdHdpbnQvJwpsZW1tYSA8LSAnQW5nbG8tU2F4b24nCgp0d2VldHMgPC0gbG9hZF9kYXRhKGNvcnB1cywgbGVtbWEpCnR3ZWV0cyA8LSBwb3N0cHJvYyh0d2VldHMpCmBgYAoKIyMjIENvbXBhcmF0aXZlIGFuYWx5c2VzCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQppZiAoZXhpc3RzKCdkZl9jb21wJykgPT0gRkFMU0UpIHsKICBkZl9jb21wIDwtIHJlYWRfY3N2KCdvdXQvZGZfY29tcC5jc3YnKQp9CmBgYAoKCiMjIyMgRmlsdGVyaW5nCgoqIHNwZWNpZmljIGxlbW1hcwogICogY293b3JrCiAgKiBzbm93Zmxha2UKKiBkYXRhIGFmdGVyIDIwMTgtMTItMzEKKiBmcmVxdWVuY3kgdGhyZXNoaG9sZAoqIGVkZ2VzIHRocmVzaGhvbGQKCgojIyBDaGVjayB0d2VldHMKCmBgYHtyfQp0d2VldHMgJT4lCiAgc2VsZWN0KHR3ZWV0LCBkYXRlKSAlPiUKICAjIHNsaWNlKC4sIHNhbXBsZSgxOm4oKSkpICNyYW5kb20gc2VsZWN0aW9uCiAgYXJyYW5nZShkYXRlKQpgYGAKCgojIyBVc2FnZSBpbnRlbnNpdHkKCmBgYHtyfQp1c2VzIDwtIGdldF91c2VzKHR3ZWV0cykKdXNlc190b3QgPC0gZ2V0X3VzZXNfdG90KHVzZXMpCmFnZSA9IGdldF9hZ2UodXNlcykKY29lZl92YXIgPC0gZ2V0X2NvZWZfdmFyKHVzZXMpCm1lYW5fZGF0ZSA8LSBnZXRfbWVhbl9kYXRlKHVzZXMpCm1heF9kYXRlIDwtIGdldF9tYXhfZGF0ZSh1c2VzKQp1c2VzX21vbnRoIDwtIGNvbnZfdXNlc19tb250aCh1c2VzKQp1c2VzX3BsdCA8LSBwbHRfdXNlcyh1c2VzX21vbnRoLCBsZW1tYSwgbWVhbl9kYXRlLCBtYXhfZGF0ZSkKZ2dwbG90bHkodXNlc19wbHQpCmBgYAoKCiMjIERlZ3JlZSBjZW50cmFsaXphdGlvbgoKIyMjIERpYWNocm9uaWMKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgIT0gJ2Z1bGwnLAogICAgIyBMRU1NQSA9PSAnc29sb3ByZW5ldXInCiAgICBMRU1NQSAlaW4lIGMoCiAgICAgICdwb2xpdGljYWwgY29ycmVjdG5lc3MnCiAgICAgICkKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIENFTlRfREVHUkVFKSAlPiUKICBtdXRhdGUoU1VCU0VUID0gZmFjdG9yKFNVQlNFVCwgbGV2ZWxzPWMoJ2ZpcnN0JywgJ21lYW4nLCAnbWF4JywgJ2xhc3QnKSkpICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9Q0VOVF9ERUdSRUUpKSArICMgZ3JvdXA9MQogICAgZ2VvbV9wb2ludChhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBzaGFwZT1MRU1NQSkpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBsaW5ldHlwZT1MRU1NQSkpICsKICAgIGd1aWRlcyhncm91cD1GQUxTRSkgKwogICAgZ2d0aXRsZSgnRGlmZnVzaW9uIG92ZXIgdGltZTogY2hhbmdlcyBpbiBkZWdyZWUgY2VudHJhbGl6YXRpb24nKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoJ2RlZ3JlZSBjZW50cmFsaXR5IChsb2cpJywgdHJhbnM9J2xvZycpICsKICAgIHNjYWxlX3hfZGlzY3JldGUoJ3N1YnNldCcpCgpwbHQKCiMgZ2dzYXZlKCdvdXQvY2VudF9kZWdfZGlhY19Bbmdsby1TYXhvbi5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyBDb21wYXJhdGl2ZSBhbmFseXNlcwoKCiMjIERlZ3JlZSBjZW50cmFsaXR5CgoKIyMjIE92ZXJhbGwKCiMjIyMgTGlzdAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVMsIENFTlRfREVHUkVFKSAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgPT0gJ2Z1bGwnLAogICAgIyBVU0VTID49IDEwMDAwCiAgICApICU+JQogIGFycmFuZ2UoKENFTlRfREVHUkVFKSkKYGBgCgoKIyMjIyBQbG90CgpgYGB7cn0KcGx0IDwtIGRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVMsIENFTlRfREVHUkVFKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgYXJyYW5nZSgoQ0VOVF9ERUdSRUUpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9Q0VOVF9ERUdSRUUsIHk9cmVvcmRlcihMRU1NQSwgQ0VOVF9ERUdSRUUpKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfZGlzY3JldGUoJ2xlbW1hcycpICsKICAgIHNjYWxlX3hfY29udGludW91cygKICAgICAgJ2RlZ3JlZSBjZW50cmFsaXphdGlvbiAobG9nKScsCiAgICAgIHRyYW5zPSdsb2cnCiAgICAgICkKCnBsdAoKIyBnZ3NhdmUoJ291dC9jZW50X3N5bmNfYWxsLnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCgojIyMgT3ZlciB0aW1lCgojIyMjIEFjcm9zcyBhbGwgbGVtbWFzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgJWluJSAoYygKICAgICAgJ2ZpcnN0JywgCiAgICAgICdsYXN0JwogICAgICAjICdtZWFuJywKICAgICAgIyAnbWF4JwogICAgICApKSwKICAgIEVER0VTID49IDcwMAogICAgKSAlPiUKICBncm91cF9ieShTVUJTRVQpICU+JQogIHN1bW1hcml6ZShDRU5UX0FWRyA9IG1lYW4oQ0VOVF9ERUdSRUUpKSAlPiUKICBtdXRhdGUoU1VCU0VUID0gZmFjdG9yKFNVQlNFVCwgbGV2ZWxzPWMoCiAgICAnZmlyc3QnLCAKICAgICdsYXN0JwogICAgIyAnbWVhbicsCiAgICAjICdtYXgnCiAgICApKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVNVQlNFVCwgeT1DRU5UX0FWRywgZ3JvdXA9MSkpICsKICAgIGdlb21fY29sKCkKYGBgCgoKIyMjIyBCaWdnZXN0IGNoYW5nZXMKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBDRU5UX0RFR1JFRSwgRURHRVMpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoJ2ZpcnN0JywgJ2xhc3QnKSwKICAgIEVER0VTID49IDEwMAogICAgKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTEVNTUEpICU+JQogIGRwbHlyOjptdXRhdGUoQ0VOVF9ESUZGID0gbGFnKENFTlRfREVHUkVFKSAtIENFTlRfREVHUkVFKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgc2VsZWN0KC1TVUJTRVQpICU+JQogIHJlbmFtZSgKICAgIENFTlRfTEFTVCA9IENFTlRfREVHUkVFLAogICAgRURHRVNfTEFTVCA9IEVER0VTCiAgICApICU+JQogIGFycmFuZ2UoZGVzYyhDRU5UX0RJRkYpKQpgYGAKCgojIFVzYWdlIGludGVuc2l0eQoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIGFycmFuZ2UoZGVzYyhVU0VTKSkKYGBgCgoKCiMgVXNhZ2UgaW50ZW5zaXR5IHZzLiBuZXR3b3JrIGNoYXJhY3RlcmlzdGljcwoKIyMgVXNlcyB2cy4gZGVncmVlIGNlbnRyYWxpemF0aW9uCgojIyMgUGxvdAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJywKICAgICMgVVNFUyAlaW4lICgxMDAwMDoyMDAwMDAwKSwKICAgIFVTRVMgJWluJSAoMTUwMDAwOjUwMDAwMCksCiAgICAhTEVNTUEgJWluJSBjKCdzbHV0IHNoYW1pbmcnLCAnZGFzaGNhbScsICdzaGFyZWFibGUnLCAnY3Vja29sZCcsICdkZWVwIGxlYXJuaW5nJywgJ2h5cGVybG9jYWwnKQogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIENFTlRfREVHUkVFLCBVU0VTLCBFREdFUykgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PVVTRVMpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSwgaGp1c3Q9LTAuMSwgdmp1c3Q9LTAuMSkgKyAKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICAgICd1c2FnZSBmcmVxdWVuY3kgKGxvZyknLCAKICAgICAgdHJhbnM9J2xvZycKICAgICAgKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICAgICdkZWdyZWUgY2VudHJhbGl6YXRpb24nLAogICAgICAjIHRyYW5zPSdsb2cnCiAgICAgICkgKwogICAgZ2d0aXRsZSgKICAgICAgIyAnVXNhZ2UgZnJlcXVlbmN5IHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb246IGZ1bGwgc2FtcGxlJwogICAgICAnVXNhZ2UgZnJlcXVlbmN5IHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb246IHpvb21pbmcgb24gY2FzZSBzdHVkeSBsZXhlbWVzJwogICAgICApCiAgICAjIGdlb21fc21vb3RoKG1ldGhvZD1sbSkKCmdnc2F2ZSgnfi9EZXNrdG9wL2ZyZXEtdnMtbmV0LnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQogICAgCmBgYAoKIyMjIENvcnJlbGF0aW9uCgpgYGB7cn0KZGZfY29ycl9mdWxsIDwtIGRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICE9ICdmdWxsJywKICAgIEVER0VTID49IDEwMAogICAgKSAlPiUKICBzZWxlY3QoLWMoTEVNTUEsIFNVQlNFVCwgTkVUX1dJTkRPV19EQVRFUywgU0tJUCwgU1RBTVAsIE5ST1dTKSkKICAKY29yLnRlc3QoZGZfY29ycl9mdWxsJFVTRVMsIGRmX2NvcnJfZnVsbCRDRU5UX0RFR1JFRSkKYGBgCgoKIyMgRGVncmVlIGNlbnRyYWxpdHkgdnMuIGNvbW11bml0aWVzCgojIyMgQ29ycmVsYXRpb24KCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2xhc3QnKSAlPiUKICBzZWxlY3QoQ0VOVF9ERUdSRUUsIENPTU1VTklUSUVTKSAlPiUKICBtdXRhdGUoQ09NTVVOSVRJRVMgPSBhcy5udW1lcmljKENPTU1VTklUSUVTKSkgJT4lCiAgY29ycmVsYXRlKCkKYGBgCgoKIyMjIFBsb3QKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2xhc3QnKSAlPiUKICBzZWxlY3QoTEVNTUEsIENFTlRfREVHUkVFLCBDT01NVU5JVElFUykgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PWFzLm51bWVyaWMoQ09NTVVOSVRJRVMpKSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MRU1NQSkpICsKICAgIHNjYWxlX3hfY29udGludW91cyh0cmFucz0nbG9nJykKYGBgCgoKCiMjIFVzZXMgdnMuIHVzZXJzCgojIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFVTRVMsIFVTRVJTKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9VVNFUlMsIHk9VVNFUykpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9TEVNTUEpKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9J2xvZycpICsKICAgIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nJykgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtKQpnZ3Bsb3RseShwbHQpCmBgYAoKIyMjIENvcnJlbGF0aW9uCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgc2VsZWN0KFVTRVMsIFVTRVJTKSAlPiUKICBjb3JyZWxhdGUoKQpgYGAKCgojIyBDb2VmZmljaWVudCBvZiB2YXJpYXRpb24KCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZnVsbCcsCiAgICBVU0VTID49IDEwMDAKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTLCBDT0VGX1ZBUikgJT4lCiAgYXJyYW5nZShkZXNjKENPRUZfVkFSKSkKYGBgCgoKIyMgUHJvY2Vzc2luZyBzdGF0dXMKCiMjIyBMZW1tYSBsaXN0CgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgU1RBTVApICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBtdXRhdGUoU1RBTVAgPSBhc19kYXRldGltZShTVEFNUCkpICU+JQogIGFycmFuZ2UoZGVzYyhTVEFNUCkpCmBgYAoKCiMjIyBEYXRhc2V0IHN0YXRpc3RpY3MKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgVVNFUlMpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBVU0VTX1RPVCA9IHN1bShVU0VTKSwKICAgIFVTRVJTX1RPVCA9IHN1bShVU0VSUykKICAgICkKYGBgCgoKIyBDT0VGX1ZBUiB2cy4gQ0VOVAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIHNlbGVjdChMRU1NQSwgQ09FRl9WQVIsIENFTlRfREVHUkVFKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHk9Q09FRl9WQVIsIHg9Q0VOVF9ERUdSRUUpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSdsb2cnKQpgYGAKCgojIENvcnJlbGF0aW9uczogRURBCgpgYGB7cn0KbGlicmFyeShIbWlzYykKCmRmX2NvcnIgPC0gZGZfY29tcCAlPiUKICAjIGZpbHRlcihTVUJTRVQgPT0gJ2xhc3QnKSAlPiUKICBzZWxlY3QoLWMoTEVNTUEsIFNVQlNFVCwgTkVUX1dJTkRPV19EQVRFUywgU0tJUCwgU1RBTVAsIE5ST1dTKSkKICAjIHNlbGVjdCgtYyhVU0VSUywgQUdFKSkgJT4lCiAgIyBtdXRhdGUoRk9DVVMgPSBVU0VTKSAlPiUKICAjIGZvY3VzKEZPQ1VTKSAlPiUKICAjIGdncGxvdCguLCBhZXMocmVvcmRlcihyb3duYW1lLCBGT0NVUyksIEZPQ1VTKSkgKwogICAgIyBnZW9tX2NvbCgpICsKICAgICMgY29vcmRfZmxpcCgpCiAgIyByZWFycmFuZ2UoKSAlPiUKICAjIHNoYXZlKCkgJT4lCiAgIyBycGxvdCgpCiAgIyBuZXR3b3JrX3Bsb3QobWluX2Nvcj0uNSkgJT4lCgogIApgYGAKCgogIA==